package com.kerbores.utils.config.loader;

import java.util.Date;

import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.log.Log;
import org.nutz.log.Logs;

import com.kerbores.utils.net.UrlPoster;

/**
 * 系统变量加载器
 * 
 * @author 王贵源
 * @email kerbores@kerbores.com
 *
 *        create at 2015年10月13日 下午3:08:57
 */
public class SystemVariablesLoader {

    protected static Log log = Logs.getLog(SystemVariablesLoader.class);
    /**
     * 线上变量加载地址
     */
    public static final String ONLINE_VARIABLES_LOADING_URL = "http://10.116.150.83/scm/soa/systemVariablesLoading";
    // TODO 更改为线上地址
    /**
     * 线下变量加载地址
     */
    public static final String OFFLINE_VARIABLES_LOADING_URL = "http://10.0.1.101/scm/soa/systemVariablesLoading";

    /**
     * 全局变量名称常量集
     * 
     * @author 王贵源
     * @email kerbores@kerbores.com
     *
     *        create at 2015年10月14日 上午9:17:22
     */
    public static class SystemVariablesNames {
	public static final String MSG_SEND_URL = "MSG.SEND.URL";// 消息平台地址key
	public static final String IMG_UPLOAD_URL = "IMG.UPLOAD.URL";// 图片上传接口地址
	public static final String IMG_UPLOAD_BY_URL = "IMG.UPLOAD.BY.URL";// 图片上传接口地址
	public static final String IMG_CLIP_URL = "IMG.CLIP.URL";// 图片裁剪接口地址
	public static final String IMG_SERVER_URL = "IMG.SERVER.URL";// 图片服务器地址
	public static final String BAIDU_IP2LOCATION = "BAIDU.IP2LOCATION";// 百度经纬度转换
    }

    // 数据代理
    private static NutMap proxy;

    /**
     * 获取字符串配置值
     * 
     * @param key
     *            配置key
     * @return
     */
    public static String getsString(String key) {
	return getAs(key, String.class);
    }

    /**
     * 获取整数配置
     * 
     * @param key
     *            配置key
     * @return
     */
    public static int getInt(String key) {
	return getAs(key, Integer.class);
    }

    public static long getLong(String key) {
	return getAs(key, Long.class);
    }

    public static double getDouble(String key) {
	return getAs(key, Double.class);
    }

    public static boolean getBoolean(String key) {
	return getAs(key, Boolean.class);
    }

    public static Date getDate(String key) {
	return getAs(key, Date.class);
    }

    /**
     * 获取指定类型的配置
     * 
     * @param key
     *            配置key
     * @param classOfT
     *            类型
     * @return
     */
    public static <T> T getAs(String key, Class<T> classOfT) {
	if (proxy == null || proxy.get(key) == null) {// 没有配置信息或者对应key没有值的时候重新加载
	    log.debug(key + " has no cache in proxy reloading infos .....");
	    load();
	}
	return proxy.getAs(key, classOfT);
    }

    /**
     * 加载配置<br>
     * 真实发送请求获取数据
     */
    private static void load() {
	String loadingUrl = ONLINE_VARIABLES_LOADING_URL;
	String env = System.getenv("env_type");
	if (Strings.isBlank(env)) {
	    loadingUrl = OFFLINE_VARIABLES_LOADING_URL;
	}
	log.debug("loading info from url '" + loadingUrl + "' .....");
	String info = UrlPoster.simpleUTF8Post(loadingUrl, NutMap.NEW());
	proxy = NutMap.WRAP(info);
    }

    public static void main(String[] args) {
	System.err.println(getsString(SystemVariablesNames.MSG_SEND_URL));
	System.err.println(getsString(SystemVariablesNames.IMG_CLIP_URL));
	System.err.println(getsString(SystemVariablesNames.IMG_UPLOAD_URL));
    }

}
